package com.zenithmind.coding.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 编程竞赛实体类 - 遵循单一职责原则，专门处理竞赛基本信息
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@TableName("coding_contest")
@Schema(description = "编程竞赛实体")
public class Contest extends BaseEntity {

    /**
     * 竞赛标题
     */
    @Schema(description = "竞赛标题")
    @EqualsAndHashCode.Include
    private String title;

    /**
     * 竞赛描述
     */
    @Schema(description = "竞赛描述")
    private String description;

    /**
     * 竞赛类型（1-个人赛，2-团队赛，3-练习赛，4-正式赛）
     */
    @Schema(description = "竞赛类型（1-个人赛，2-团队赛，3-练习赛，4-正式赛）")
    private Integer type;

    /**
     * 竞赛状态（0-未开始，1-进行中，2-已结束，3-已取消）
     */
    @Schema(description = "竞赛状态（0-未开始，1-进行中，2-已结束，3-已取消）")
    private Integer status;

    /**
     * 难度等级（1-入门，2-初级，3-中级，4-高级，5-专家）
     */
    @Schema(description = "难度等级（1-入门，2-初级，3-中级，4-高级，5-专家）")
    private Integer difficulty;

    /**
     * 开始时间
     */
    @Schema(description = "开始时间")
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    @Schema(description = "结束时间")
    private LocalDateTime endTime;

    /**
     * 竞赛时长（分钟）
     */
    @Schema(description = "竞赛时长（分钟）")
    private Integer duration;

    /**
     * 报名开始时间
     */
    @Schema(description = "报名开始时间")
    private LocalDateTime registrationStartTime;

    /**
     * 报名结束时间
     */
    @Schema(description = "报名结束时间")
    private LocalDateTime registrationEndTime;

    /**
     * 最大参赛人数
     */
    @Schema(description = "最大参赛人数")
    private Integer maxParticipants;

    /**
     * 当前参赛人数
     */
    @Schema(description = "当前参赛人数")
    private Integer currentParticipants;

    /**
     * 问题列表（JSON格式）
     */
    @Schema(description = "问题列表（JSON格式）")
    private String problemIds;

    /**
     * 问题数量
     */
    @Schema(description = "问题数量")
    private Integer problemCount;

    /**
     * 评分规则（JSON格式）
     */
    @Schema(description = "评分规则（JSON格式）")
    private String scoringRules;

    /**
     * 排名规则（JSON格式）
     */
    @Schema(description = "排名规则（JSON格式）")
    private String rankingRules;

    /**
     * 是否公开（0-私有，1-公开）
     */
    @Schema(description = "是否公开（0-私有，1-公开）")
    private Integer isPublic;

    /**
     * 是否需要密码（0-否，1-是）
     */
    @Schema(description = "是否需要密码（0-否，1-是）")
    private Integer requirePassword;

    /**
     * 竞赛密码
     */
    @Schema(description = "竞赛密码")
    private String password;

    /**
     * 是否实时排名（0-否，1-是）
     */
    @Schema(description = "是否实时排名（0-否，1-是）")
    private Integer isRealTimeRanking;

    /**
     * 是否封榜（0-否，1-是）
     */
    @Schema(description = "是否封榜（0-否，1-是）")
    private Integer isFrozen;

    /**
     * 封榜时间
     */
    @Schema(description = "封榜时间")
    private LocalDateTime frozenTime;

    /**
     * 奖励设置（JSON格式）
     */
    @Schema(description = "奖励设置（JSON格式）")
    private String rewards;

    /**
     * 竞赛规则
     */
    @Schema(description = "竞赛规则")
    private String rules;

    /**
     * 创建者ID
     */
    @Schema(description = "创建者ID")
    private String creatorId;

    /**
     * 创建者名称
     */
    @Schema(description = "创建者名称")
    private String creatorName;

    /**
     * 管理员列表（JSON格式）
     */
    @Schema(description = "管理员列表（JSON格式）")
    private String adminIds;

    /**
     * 竞赛标签（JSON格式）
     */
    @Schema(description = "竞赛标签（JSON格式）")
    private String tags;

    /**
     * 竞赛封面图片
     */
    @Schema(description = "竞赛封面图片")
    private String coverImage;

    /**
     * 是否推荐（0-否，1-是）
     */
    @Schema(description = "是否推荐（0-否，1-是）")
    private Integer isRecommend;

    /**
     * 排序值
     */
    @Schema(description = "排序值")
    private Integer sortOrder;

    /**
     * 重写equals方法以确保里氏替换原则
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        if (!super.equals(obj)) return false;

        Contest contest = (Contest) obj;
        return Objects.equals(title, contest.title);
    }

    /**
     * 重写hashCode方法以确保里氏替换原则
     */
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), title);
    }

    /**
     * 检查竞赛是否进行中
     */
    public boolean isRunning() {
        return Integer.valueOf(1).equals(this.status);
    }

    /**
     * 检查竞赛是否已结束
     */
    public boolean isFinished() {
        return Integer.valueOf(2).equals(this.status);
    }

    /**
     * 检查竞赛是否已取消
     */
    public boolean isCancelled() {
        return Integer.valueOf(3).equals(this.status);
    }
}
